import axios from "axios";
import { load, save } from "./localcache";

// const baseURL = "https://www.forerunnercollege.com/so2Api";
// const baseURL = "http://127.0.0.1:8888/api";
const baseURL = "/api";

// 用于防抖
const set = new Set<string>();


function ajax(url: string, data: object = {}, method: "post" | "get" = "post"): Promise<any> {

    const jsonStr = JSON.stringify(data);
    const key = url + jsonStr + method;

    // 缓存数据
    const obj = load(key);
    if (null != obj) {
        console.log("缓存命中！");
        return Promise.resolve({ data: obj });
    }

    // console.log("key = ",key);
    if (set.has(key)) {
        console.log("请勿重复提交：", key);
        return Promise.reject({ data: { status: -1, msg: "请勿重复提交" } });
    }

    set.add(key);

    // 一分钟之后移除掉（兜底）
    // setTimeout(() => set.delete(url),60 * 1000);

    return axios({
        baseURL,
        url,
        data,
        method
    });
}

axios.interceptors.request.use(config => {
    // const token: string | undefined = store.state?.admin?.token;
    // if (token) {
    //     config.headers = {
    //         "Authorization": token
    //     }
    // }
    return config;
})

// 响应拦截
axios.interceptors.response.use(
    // 成功之后的响应拦截
    res => {
        const { url, data, method } = res.config;
        const key = url + data + method;
        set.delete(key);
        console.log("响应拦截，key = ", key);
        // console.log(":", res);
        // status小于0表示逻辑失败
        // 如果为-10表示没有登录，强制去往登陆页面
        if (res.data.status == -10) {
            // router.push("/");
        } else if (res.data.status < 0) {
            // alert(res.data.msg);
            // 这里window.alert被重写了的
            alert({ type: "error", message: res.data.msg });
            // 成功后缓存数据
        } else if (res.data.status >= 1) {
            save(url,
                data,
                method,
                res.data);
        }
        return res;
    },
    // 失败之后的响应拦截（404,500,400）
    error => {
        console.log("响应失败：", error);
        if (error.config) {
            const { url, data, method } = error.config;
            const key = url + data + method;
            set.delete(key);
        }
        alert({ type: "error", message: "发生网络错误" });
        // alert("发生网络错误");
        // 返回一个明确的promise对象，避免组件报错，方便组件编写代码
        return Promise.reject({ data: { status: -1, msg: "网络错误" } });
    }
)

export default ajax;